class Solution {
    public int maximumLength(String S) {
        //灵神的题解终于能看了
        //我们将这些连续的特殊字符串进行分组
        //特殊字符串一定都是相同的，并且都是小写的
        //我们创建26个数组来记录
        char[] s = S.toCharArray();
        System.out.println();
        List<Integer>[] groups = new ArrayList[26];

        //这种方法很冗余，我们直接利用现成的方法来初始化
        // for (int i = 0; i < 26; i++) {
        //     groups[i] = new ArrayList<>();
        // }

        Arrays.setAll(groups, i -> new ArrayList<>());

        //之后找连续的特殊字符串
        int cnt = 0;
        for (int i = 0; i < s.length; i++) {
            cnt++;
            if (i + 1 == s.length || s[i] != s[i + 1]) {
                groups[s[i] - 'a'].add(cnt);
                cnt = 0;
            }
        }

        int ans = 0;
        //遍历组数，并将里面的数据降序排序
        for (List<Integer> tmp : groups) {
            if (tmp.isEmpty()) {
                continue;
            }

            //将tmp倒序排序
            //其中Collection.reverseOrder()是一个比较器
            //将tmp中元素进行降序
            tmp.sort(Collections.reverseOrder());

            //害怕越界，因为可能里面只有一个元素
            tmp.add(0);
            tmp.add(0);

            ans = Math.max(ans, Math.max(tmp.get(0) - 2, Math.max(Math.min(tmp.get(0) - 1, tmp.get(1)), tmp.get(2))));
        }

        return ans > 0 ? ans : -1;
    }
}


public class Main {
    public static void main(String[] args) {

    }
}
